﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
    public class TurnoAdapter
    {

        BDRinconLuzEntities contexto;

        public TurnoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

        public TurnoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }
      
        public void Agregar(Turno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

        public void Eliminar(Turno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<Turno> objectSet = contexto.CrearSet<Turno>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



        public void Modificar(Turno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


        public IEnumerable<Turno> Obtener()
        {
            return contexto.CrearSet<Turno>();
        }


        public List<ViewEntity> ObtenerCiclosLectivosAñoActual()
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var listaCiclosLectivos = (from v in contexto.CicloLectivo
                                       where v.FechaDesde.Value.Year == DateTime.Now.Year ||
                                       v.FechaHasta.Value.Year == DateTime.Now.Year &&
                                        v.Eliminado != true
                                       select v).ToList();


            foreach (var item in listaCiclosLectivos)
            {
                ListaFinal.Add(new ViewEntity(item.IdCicloLectivo,item.NombreCicloLectivo));


            }

            return ListaFinal;
        }

        public List<ViewEntity> ObtenerTurnosAñoActual()
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var cicloActual = (from v in contexto.CicloLectivo
                               where v.FechaDesde.Value.Year == DateTime.Now.Year &&
                                v.Eliminado != true
                               select v).First();

            if (cicloActual != null)
            {
                var listaTurnos = (from v in contexto.Turno
                                   where v.IdCicloLectivo == cicloActual.IdCicloLectivo &&
                                    v.Eliminado != true
                                   select v).ToList();

            

                if (listaTurnos.Count > 0)
                {

                    foreach(var item in listaTurnos)
                    {
                        // Validamos que el turno no tenga el supo lleno mediante un Stored Procedure
                    var cantidadInscriptos = contexto.ExecuteStoreCommand("Exec SP_Turno_CantidadInscriptos @IdTurno", new SqlParameter("IdTurno", item.IdTurno));
                    if(cantidadInscriptos < item.CupoMaximo)
                        ListaFinal.Add(new ViewEntity(item.IdTurno, item.NombreTurno));
        

                    }

                }

            }

            return ListaFinal;
        }


        public List<ViewEntity> ObtenerTurnosPorAño(int año)
        {
            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var cicloActual = (from v in contexto.CicloLectivo
                               where v.FechaDesde.Value.Year == año &&
                                    v.Eliminado != true
                               select v).First();

            if (cicloActual != null)
            {
                var listaTurnos = (from v in contexto.Turno
                                   where v.IdCicloLectivo == cicloActual.IdCicloLectivo &&
                                        v.Eliminado != true
                                   select v).ToList();



                if (listaTurnos.Count > 0)
                {

                    foreach (var item in listaTurnos)
                    {                       
                        ListaFinal.Add(new ViewEntity(item.IdTurno, item.NombreTurno));
                    }

                }

            }

            return ListaFinal;
        }

        public Turno ObtenerEntidad(Guid idTurno)
        {
                      
                var Entidad = (from v in contexto.Turno.Include("CicloLectivo")
                               where v.IdTurno == idTurno &&
                                     v.Eliminado != true
                               select v).First();
                return Entidad;
            
        }

        public bool TieneInscriptos(Guid idTurno)
        {

            var ExistenEntidades = (from v in contexto.InscripcionCicloLectivo
                                    where v.IdTurno == idTurno
                                    select v).Any();

            return ExistenEntidades;
            
        }

        public bool ExisteNombreSala(Turno turno)
        {

            var ExistenEntidades = (from v in contexto.Turno
                                    where v.IdTurno != turno.IdTurno &&
                                    v.IdCicloLectivo == turno.IdCicloLectivo &&
                                    v.NombreSala.ToLower() == turno.NombreSala.ToLower() &&
                                    v.Eliminado != true
                                    select v).Any();

            return ExistenEntidades;

        }

        public bool ExisteNombreTurno(Turno turno)
        {

            var ExistenEntidades = (from v in contexto.Turno
                                    where v.IdTurno != turno.IdTurno &&
                                    v.IdCicloLectivo == turno.IdCicloLectivo &&
                                    v.NombreTurno.ToLower() == turno.NombreTurno.ToLower() &&
                                    v.Eliminado != true
                                    select v).Any();

            return ExistenEntidades;

        }



        public bool ExistenTurnosAñoSeleccionado(int año)
        {

            var ExistenEntidades = (from v in contexto.Turno
                                    where v.CicloLectivo.FechaDesde.Value.Year == año &&
                                    v.Eliminado != true
                                    select v).Any();

            return ExistenEntidades;

        }


        public List<Turno> ObtenerEntidadesPorAño(int año)
        {

            var Entidades = (from v in contexto.Turno
                             where v.CicloLectivo.FechaDesde.Value.Year == año &&
                             v.Eliminado != true
                             select v).ToList();


            return Entidades;
        }

    }
}
